﻿using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace WWLauncher.Util
{
    class RegisterUtil
    {

        #region 注册表开机自启动
        /// <summary>
        /// 开机自动启动
        /// </summary>
        /// <param name="started">设置开机启动，或取消开机启动</param>
        /// <param name="exeName">注册表中的名称</param>
        /// <returns>开启或停用是否成功</returns>
        public static bool SetSelfStarting(bool started, string exeName)
        {
            RegistryKey key = null;
            try
            {
                string exeDir = System.Windows.Forms.Application.ExecutablePath;
                key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);//打开注册表子项

                if (key == null)//如果该项不存在的话，则创建该子项
                {
                    key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
                }
                if (started)
                {
                    try
                    {
                        object ob = key.GetValue(exeName, -1);

                        if (!ob.ToString().Equals(exeDir))
                        {
                            if (!ob.ToString().Equals("-1"))
                            {
                                key.DeleteValue(exeName);//取消开机启动
                            }
                            key.SetValue(exeName, exeDir);//设置为开机启动
                        }
                        key.Close();

                    }
                    catch (Exception ex)
                    {
                        LogUtil.WriteErrorLog(ex, "设置开机/取消失败!started=" + started);
                        return false;
                    }
                }
                else
                {
                    try
                    {
                        key.DeleteValue(exeName);//取消开机启动
                        key.Close();
                    }
                    catch (Exception ex)
                    {
                        LogUtil.WriteErrorLog(ex, "取消开机启动失败!started=" + started);
                        return false;
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                LogUtil.WriteErrorLog(ex, "取消/开机/失败!started=" + started);
                if (key != null)
                {
                    key.Close();
                }
                return false;
            }
        }

        #endregion


        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
        static extern int MessageBox(IntPtr hwnd, string text, string caption, uint type);

        /// <summary>
        /// 从注册表导出到文件，在导出的过程是异步的，不受操作进程管理
        /// </summary>
        /// <param name="SavingFilePath">从注册表导出的文件，如果是已存在的，会提示覆盖；
        /// 如果不存在由参数指定名字的文件，将自动创建一个。导出的文件的扩展名应当是.REG的</param>
        /// <param name="regPath">指定注册表的某一键被导出，如果指定null值，将导出整个注册表</param>
        /// <returns>成功返回0，用户中断返回1</returns>
        public static int ExportReg(string SavingFilePath, string regPath)
        {
            //获得当前登录的Windows用户标示
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
            {
                return 0;
            }


            Process.Start(
                    "regedit",
                    string.Format(" /E {0} {1} ", SavingFilePath, regPath));

            // RegisterUtil.ExportReg(@"z:\Desktop.reg",null);
            return 0;
        }
        /// <summary>
        /// 从文件导入的注册表
        /// </summary>
        /// <param name="SavedFilePath">指定在磁盘上存在的文件，如果指定的文件不存在，将抛出异常</param>
        /// <param name="regPath">指定注册表的键（包含在SavedFilePath文件中保存的关键字），如果该参数设置为null将导入整个SavedFilePath文件
        /// 中保存的所有关于注册表的关键字</param>
        /// <returns>成功返回0</returns>
        public static int ImportReg(string SavedFilePath, string regPath)
        {
            if (!File.Exists(SavedFilePath))
                throw new ArgumentException("参数 SavedFilePath 指定无效路径");
            Process.Start(
                   "regedit",
                   string.Format(" /C {0} {1}",
                   SavedFilePath,
                   regPath));//线程外的

            return 0;

        }

    }
}
